/**
 * created by 小卷毛, 2021-07-05
 * Copyright (c) 2021, 416143467@qq.com All Rights Reserved.
 * #                   *********                            #
 * #                  ************                          #
 * #                  *************                         #
 * #                 **  ***********                        #
 * #                ***  ****** *****                       #
 * #                *** *******   ****                      #
 * #               ***  ********** ****                     #
 * #              ****  *********** ****                    #
 * #            *****   ***********  *****                  #
 * #           ******   *** ********   *****                #
 * #           *****   ***   ********   ******              #
 * #          ******   ***  ***********   ******            #
 * #         ******   **** **************  ******           #
 * #        *******  ********************* *******          #
 * #        *******  ******************************         #
 * #       *******  ****** ***************** *******        #
 * #       *******  ****** ****** *********   ******        #
 * #       *******    **  ******   ******     ******        #
 * #       *******        ******    *****     *****         #
 * #        ******        *****     *****     ****          #
 * #         *****        ****      *****     ***           #
 * #          *****       ***        ***      *             #
 * #            **       ****        ****                   #
 */
@file:Suppress("ClassName", "unused")

package com.rzico.sbl.picture

import android.content.Context
import com.luck.picture.lib.animators.AnimationType
import com.luck.picture.lib.basic.PictureSelectionModel
import com.luck.picture.lib.basic.PictureSelector
import com.luck.picture.lib.config.PictureMimeType
import com.luck.picture.lib.config.SelectMimeType
import com.luck.picture.lib.config.SelectModeConfig
import com.luck.picture.lib.entity.LocalMedia
import com.luck.picture.lib.interfaces.OnResultCallbackListener
import com.xinnuo.common.extend.conditionIf
import com.xinnuo.common.helper.getExternalFileDirPath
import kotlin.collections.ArrayList

/**
 * 描 述：PictureSelector 扩展方法
 * 作 者：小卷毛  2021-07-05 16:09
 * 修改描述：
 * 修 改 人：
 * 修改版本：
 */

fun Context.buildSelectionModel(
    selectMode: Int = SelectModeConfig.SINGLE,
    maxSelectNum: Int = 1,
    maxSelectVideoNum: Int = 1,
    isCropEnable: Boolean = true,
    isCompressEnable: Boolean = true,
    isMarkEnable: Boolean = false,
    selectList: List<LocalMedia> = emptyList()
): PictureSelectionModel =
    PictureSelector.create(this)
        // 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
        .openGallery(SelectMimeType.ofImage())
        // 设置相册主题
        .setSelectorUIStyle(buildThemeStyle())
        // 设置相册图片加载引擎，必传项
        .setImageEngine(PictureGlideEngine.createGlideEngine())
        // 创建自定义播放器
        .setVideoPlayerEngine(null)
        // 设置相册裁剪引擎
        .setCropEngine(
            conditionIf(isCropEnable, PictureCropEngine(), null)
        )
        // 设置相册压缩引擎
        .setCompressEngine(
            conditionIf(isCompressEnable, PictureCompressEngine(), null)
        )
        // 设置相册沙盒目录拷贝引擎
        .setSandboxFileEngine(PictureSandboxEngine())
        // 拦截相机事件，实现自定义相机
        .setCameraInterceptListener(null)
        // 拦截录音事件，实现自定义录音组件
        .setRecordAudioInterceptListener(null)
        // 拦截选择限制事件，可实现自定义提示
        .setSelectLimitTipsListener(null)
        // 拦截资源编辑事件，实现自定义编辑
        .setEditMediaInterceptListener(null)
        // 自定义权限描述说明
        .setPermissionDescriptionListener(null)
        // 拦截预览事件，实现自定义预览
        .setPreviewInterceptListener(null)
        // 自定义权限被拒处理回调
        .setPermissionDeniedListener(null)
        // 自定义添加水印
        .setAddBitmapWatermarkListener(
            conditionIf(isMarkEnable, PictureMarkEvent(getExternalFileDirPath("Mark")), null)
        )
        // 自定义获取视频缩略图
        .setVideoThumbnailListener(null)
        // 预览视频是否自动播放
        .isAutoVideoPlay(true)
        // 预览视频是否循环播放
        .isLoopAutoVideoPlay(true)
        // 使用系统播放器
        .isUseSystemVideoPlayer(false)
        // 分页模式下设置过滤条件后是否同步专辑下资源的数量
        .isPageSyncAlbumCount(true)
        // 自定义loading样式
        .setCustomLoadingListener(null)
        // 自定义查询拦截条件
        .setQueryFilterListener { false }
        // 注入自定义布局回调
        .setInjectLayoutResourceListener(null)
        // 单选或是多选
        .setSelectionMode(selectMode)
        // 是否显示资源时间轴
        .isDisplayTimeAxis(true)
        // 是否只查询指定目录下的资源
        .isOnlyObtainSandboxDir(false)
        // 是否开启分页模式
        .isPageStrategy(true)
        // 是否开启原图功能
        .isOriginalControl(false)
        // 是否显示相机入口
        .isDisplayCamera(true)
        // 是否开启点击音效
        .isOpenClickSound(false)
        // 跳过不需要裁剪的类型
        .setSkipCropMimeType(
            PictureMimeType.ofGIF(),
            PictureMimeType.ofWEBP()
        )
        // 快速滑动选择
        .isFastSlidingSelect(true)
        // 是否支持视频图片同选
        .isWithSelectVideoImage(false)
        // 预览点击全屏效果
        .isPreviewFullScreenMode(true)
        // 视频支持暂停与播放
        .isVideoPauseResumePlay(false)
        // 预览缩放效果
        .isPreviewZoomEffect(true)
        // 是否支持预览图片
        .isPreviewImage(true)
        // 是否支持预览视频
        .isPreviewVideo(false)
        // 是否支持音频预览
        .isPreviewAudio(false)
        // 设置Item列表选中/取消动画
        .setGridItemSelectAnimListener(null)
        // 设置选中Item动画
        .setSelectAnimListener(null)
        // 达到最大选择数是否开启禁选蒙层
        .isMaxSelectEnabledMask(true)
        // 单选时是否立即返回
        .isDirectReturnSingle(true)
        // 图片最大选择数量
        .setMaxSelectNum(maxSelectNum)
        // 视频最大选择数量
        .setMaxVideoSelectNum(maxSelectVideoNum)
        // 相册列表动画效果
        .setRecyclerAnimationMode(AnimationType.ALPHA_IN_ANIMATION)
        // 是否显示gif文件
        .isGif(false)
        // 是否显示webp文件
        .isWebp(false)
        // 是否显示bmp文件
        .isBmp(false)
        .setSelectedData(selectList)

fun PictureSelectionModel.callback(listener: _OnResultListener.() -> Unit) =
    forResult(_OnResultListener().apply { listener() })

open class _OnResultListener : OnResultCallbackListener<LocalMedia> {

    private var _onResult: ((ArrayList<LocalMedia>?) -> Unit)? = null
    private var _onCancel: (() -> Unit)? = null

    fun onResult(listener: (ArrayList<LocalMedia>?) -> Unit) {
        _onResult = listener
    }

    fun onCancel(listener: () -> Unit) {
        _onCancel = listener
    }

    override fun onResult(result: ArrayList<LocalMedia>?) {
        _onResult?.invoke(result)
    }

    override fun onCancel() {
        _onCancel?.invoke()
    }

}